查看原文
其他

美女面试官问我:能说几个常见的Linux性能调优命令吗?

田维常 Java后端技术全栈 2021-08-29

案例关注“Java后端技术全栈

回复“000”获取大量电子书

本文主要内容:


简单回答:

top、iostat、pidstat、ps、vmstat、netstat、sar等。

能细说一下吗?下面就来好好聊聊这几这个命令。

top命令

top命令是Linux下常用的性能分享工具,能够实时显示系统中各个进程的资源占用状况信息。使用top命令输出:

输出信息可以分为两部分:

  • 系统统计信息
  • 进程信息
head部分

第一行

  • “11:16:53”为系统当前时刻;

  • “728 days,  1:28”为系统启动后到现在的运作时间;

  • “2 user”为当前登录到系统的用户,更确切的说是登录到用户的终端数 , 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目;

  • “load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程;

第二行

  • “78 total”为当前系统进程总数;

  • “1 running”为当前运行中的进程数;

  • “77 sleeping”为当前处于等待状态中的进程数;

  • “0 stoped”为被停止的系统进程数;

  • “0 zombie”为被复原的进程数;

第三行

  • 分别表示了 CPU 当前的使用率;

第四行

  • 分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量;

第五行

表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。

body部分

参数说明

在top命令下,按下f键。可以进行列的选择,使用o键可以更改列的显示顺序。

另外一些常见快捷键:

上下箭头:上下滚动查看进程;

  • u:显示指定用户的进程;
  • P:按照进程使用的CPU时间百分比排序;
  • M:按照进程使用的内存百分比排序;
  • T:按照进程已连续运行时间排序;

注意:使用top命令可以从宏观上观察系统各个进程对CPU的占用情况以及内存使用情况。

使用方式

top [-][d] [p][q] [c][C] [S][s] [n]

参数说明:
  • d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
  • p:通过指定监控进程ID来仅仅监控某个进程的状态。
  • q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • S:指定累计模式。
  • s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • i:使top不显示任何闲置或者僵死进程。
  • c:显示整个命令行而不只是显示命令名

sar命令

sar命令也是Linux系统中重要的性能监测工具之一,特可以周期性地对内存和CPU进行采样。

下面使用sar命令统计CPU使用情况,每秒钟采样一次,采样五次。

使用方式

sar [options] []

interval和count分别表示采样周期和采样数量。

options:可以指定sar命令对哪些性能数据进行采样,可能每个系统版本会导致其options不一样,所以建议先试用

sar -h

查看具体参数:

监测内存使用

我们来做一个内存使用进行采样:每秒一次,采样五次。

监测IO信息

每秒一次,采样五次。

注意:sar命令可以查看I/O信息、内存信息以及CPU情况。

vmstat命令

vmstat是一款功能比较齐全的性能监测工具,使用它可以统计CPU、内存、swap使用情况等信息。可以指定采样周期和采样次数。

小试牛刀


参数说明

procs

  • r:等等运行的进程数。
  • b:处在非终端睡眠状态的进程数。

memory

  • swpd:虚拟内存使用情况,单位:KB。
  • free :空闲的内存,单位:KB。
  • buff:被用来作为缓存的内存数,单位:KB。

swap

  • si:每秒从交换区写到内存的大小 。
  • so:每秒写入交换区的内存大小 。

io

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

system

  • in: 每秒中断数,包括时钟中断。
  • cs: 每秒上下文切换数。

CPU

  • us: 用户进程执行时间(user time)
  • sy: 系统进程执行时间(system time)
  • id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
  • wa: 等待IO时间
案例详情

模拟一个线程切换频繁的案例。

代码如下:

写一个controller:

    @RestController
    @RequestMapping("/thread")
    public class ThreadContextSwitchController 
    
        @GetMapping("/test")
        public String switchContext(){
            HoldLockDemo.test();
            try {
                Thread.sleep(200000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "ok";
        }
    }

线程切换部分代码:

    import java.util.Random;
    
    public class HoldLockDemo {
        public static Object[] lock = new Object[10];
        public static Random r = new Random();
    
        static {
            for (int i = 0; i < lock.length; i++) {
                lock[i] = new Object();
            }
        }
    
        public static class HoldLockTask implements Runnable {
            private int i;
    
            public HoldLockTask(int i) {
                this.i = i;
            }
    
            @Override
            public void run() {
                try {
                    while (true) {
                        //获取锁
                        synchronized (lock[i]) {
                            if (i % 2 == 0) {
                                System.out.println("wait");
                                //等待
                                lock[i].wait(r.nextInt(10));
                            } else {
                                System.out.println("notifyAll");
                                //唤醒所有等待所
                                lock[i].notifyAll();
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void test() {
            for (int i =0;i<lock.length;i++){
                System.out.println("test method");
                new Thread(new HoldLockTask(i/2)).start();
            }
        }
    }

访问:

使用vmstat命令一秒采样一次,采样五次:

可以看到对应cs线程切换的值,us用户CPU的值。

注意:vmstat工具可以查看内存、交互分区、I/O操作、上线文切换、时钟中断已经CPU的使用情况。

iostat命令

iostat可以提供详尽的I/O信息。

基本使用如下:每一秒采样一次,采样五次。

参数说明
  • %user:CPU处在用户模式下的时间百分比。

  • %nice:CPU处在带NICE值的用户模式下的时间百分比。

  • %system:CPU处在系统模式下的时间百分比。

  • %iowait:CPU等待输入输出完成时间的百分比。

  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

  • %idle:CPU空闲时间百分比。

注意
  • 如果%iowait的值过高,表示硬盘存在I/O瓶颈。
  • 如果%idle值高,表示CPU较空闲。
  • 如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
  • 如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
CPU属性值说明:
  • tps:该设备每秒的传输次数。
  • kB_read/s:每秒从设备(drive expressed)读取的数据量。
  • kB_wrtn/s:每秒向设备(drive expressed)写入的数据量。
  • kB_read: 读取的总数据量。
  • kB_wrtn:写入的总数量数据量。

pidstat命令

pidstat是一个功能强大的性能检测工具,特也是Systat的组件之一。

systat组件主要包括
  • iostat 工具提供CPU使用率及硬盘吞吐效率的数据; #比较核心的工具

  • mpstat 工具提供单个处理器或多个处理器相关数据;

  • pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息

  • sar 工具负责收集、报告并存储系统活跃的信息;    #统计数据的核心工具

  • sa1 工具负责收集并存储每天系统动态信息到一个二进制的文件中。它是通过计划任务工具cron来运行,是为sadc所设计的程序前端程序;

  • sa2工具负责把每天的系统活跃性息写入总结性的报告中。它是为sar所设计的前端 ,要通过cron来调用

  • sadc 是系统动态数据收集工具,收集的数据被写一个二进制的文件中,它被用作sar工具的后端;

  • sadf 显示被sar通过多种格式收集的数据;

  • nfsiostat: NFS(Network File System)的I/O统计信息。

  • cifsiostat: CIFS(Common Internet File System)的统计信息

pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

通过pidstat -help命令,可以查看到有以下几个常用参数可以监测线程的性能:

常用参数
  • -u:默认参数,显示各个进程的cpu使用情况;
  • -r:显示各个进程的内存使用情况;
  • -d:显示各个进程的I/O使用情况;
  • -w:显示每个进程的上下文切换情况;
  • -p:指定进程号;
  • -t:显示进程中线程的统计信息
监测CPU


输出参数说明:

PID: 进程pid

  • %usr: 进程在用户态运行所占cpu时间比率
  • %system: 进程在内核态运行所占cpu时间比率
  • %CPU: 进程运行所占cpu时间比率
  • CPU: 指示进程在哪个核运行
  • Command: 拉起进程对应的命令
监测内存

使用pidstat命令,还可以监测指定进程的内存使用情况。

下面就使用pidstat工具对进程pid=27180的进程进程内存监控。

每一秒采样一次,采样五次:

输出参数说明:

  • minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
  • majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
  • VSZ:      该进程使用的虚拟内存(以kB为单位)
  • RSS:      该进程使用的物理内存(以kB为单位)
  • %MEM:     该进程使用内存的百分比
  • Command:  拉起进程对应的命令
监测I/O

使用-d选项,我们可以查看进程IO的统计信息:

输出参数说明:

  • kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
  • kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
  • Command: 拉起进程对应的命令

ps命令

ps (Process Status) 。进程状态。使用该命令可以确定有哪些进程正在运行和运行的状态 。ps是显示瞬间进程的状态,并不动态连续,如果想对进程进行实时监控应该用 top 命令。

如果直接使用 ps 命令,会显示所有进程的状态,通常结合 grep 命令查看某进程的状态。(grep 即 global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

ps

结果默认会显示4列信息。

  • PID: 运行着的命令(CMD)的进程编号
  • TTY: 命令所运行的位置(终端)
  • TIME: 运行着的该命令所占用的CPU处理时间
  • CMD: 该进程所运行的命令

使用man ps可以查看:

参数:
  • -A :所有的进程均显示出来,与 -e 具有同样的效用;
  • -a :显示现行终端机下的所有进程,包括其他用户的进程;
  • -u :以用户为主的进程状态 ;
  • x :通常与 a 这个参数一起使用,可列出较完整信息。

输出格式规划:

  • l :较长、较详细的将该PID 的的信息列出;
  • j :工作的格式 (jobs format)
  • -f :做一个更为完整的输出。

使用ps -ef 命令查看Linux系统的进程

输出参数说明:

  • UID:用户ID,实际输出的是用户名,如root
  • PID:当前进程的ID
  • PPID:当前进程的父进程ID
  • C:当前进程占用的CPU的百分比
  • STIME:当前进程启动到现在的时间
  • TTY:当前进程在哪个终端上运行,若与进程无关,则显示为?,若为pts/0等,则表示由网络连接主机进程。
  • CMD:命令的名称和参数

查找mysql进程、java进程、Tomcat进程等。


还可以使用ps aux查看



常见ps操作

  • ps a 显示现行终端机下的所有程序,包括其他用户的程序。
  • ps -A 显示所有程序。
  • ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
  • ps -e 此参数的效果和指定”A”参数相同。
  • ps e 列出程序时,显示每个程序所使用的环境变量。
  • ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
  • ps -H 显示树状结构,表示程序间的相互关系。
  • ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
  • ps s 采用程序信号的格式显示程序状况。
  • ps S 列出程序时,包括已中断的子程序资料。
  • ps -t  指定终端机编号,并列出属于该终端机的程序的状况。
  • ps u  以用户为主的格式来显示程序状况。
  • ps x  显示所有程序,不以终端机来区分。

使用PS实时监控进程状态

ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来。

watch -n 1 ‘ps -aux --sort -pmem, -pcpu’

如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’

这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。举个例子,如果你只需要看名为‘root‘用户的信息,你可以使用下面的命令:

watch -n 1 ‘ps -aux -U root u --sort -pmem, -pcpu | head 20’

netstat命令

netstat命令用于显示网络相关信息,例如网络连接信息,路由表信息,端口占用情况等。建议查看:

https://www.thegeekstuff.com/2010/03/netstat-command-examples/

常见参数
  • -a (all)显示所有选项,默认不显示LISTEN相关

  • -t (tcp)仅显示tcp相关选项

  • -u (udp)仅显示udp相关选项

  • -n 拒绝显示别名,能显示数字的全部转化成数字。

  • -l 仅列出有在 Listen (监听) 的服务状态

  • -p 显示建立相关链接的程序名

  • -r 显示路由信息,路由表

  • -e 显示扩展信息,例如uid等

  • -s 按各个协议进行统计

  • -c 每隔一个固定时间,执行该netstat命令。

显示所有连接信息

-a 选项用于显示全部连接信息:

列出所有 tcp 端

netstat -at

显示监听状态的端口

netstat -l

查看某特定端口被哪个进程占用

netstat -an | grep ':8089'

总结

使用命令可以查看内存、CPU和线程切换等信息。还可以通过命令查看进程信息,以及进程对内存的占用和CPU的使用情况。


获取《程序员面试金典.pdf

快速掌握模板方法模式

线上系统CPU飙高,如何排查?

    : . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存